package com.ww.learn.coroutine.cancel

import kotlinx.coroutines.*

/**
 *  在finally块中调用挂起函数的行为都会抛出CancellationException，因为这里持续运行的代码是可以被取消的。
 *  通常，这并不是一个问题，所有良好的关闭操作（关闭一个文件、取消一个作业或是关闭任何一种通信通道）通常都是非阻塞的，并且不会调用任何挂起函数。
 */
// 打印结果
//main: I'm tired of waiting!
//main: quit.
fun main() = runBlocking {
    val job = launch {
        try {
            repeat(1000) { i ->
                println("job: I'm sleeping $i ...")
                com.ww.learn.coroutine.delay(500L)
            }
        } finally {
            withContext(NonCancellable) {
                println("job: I'm running finally")
                com.ww.learn.coroutine.delay(1000L)
                println("job: finally quit")
            }
        }
    }
    com.ww.learn.coroutine.delay(1300L) // 延迟一段时间
    println("main: I'm tired of waiting!")
    job.cancelAndJoin()
    println("main: quit.")
}